import axios from "axios";
import { ElMessage } from 'element-plus';
import pinia from '../stores/index';
import { useUserInfoStore } from '../stores/userInfo';
import NProgress from "nprogress";
import "nprogress/nprogress.css";

/**
 * 创建并配置axios实例，用于处理HTTP请求
 * 该实例包含请求和响应拦截器，用于统一处理token、进度条和错误消息
 */
const service = axios.create({
  baseURL: "/app-dev/",
  timeout: 50000,
});

/**
 * 请求拦截器
 * 在发送请求前添加token到请求头，并启动进度条
 * @param {Object} config - axios请求配置对象
 * @returns {Object} 配置后的请求配置对象
 */
service.interceptors.request.use((config) => {
  NProgress.start()//开启进度条
  // 如果有token, 通过请求头携带给后台
  const userInfoStore = useUserInfoStore(pinia) // 如果不是在组件中调用,必须传入pinia
  const token = userInfoStore.token
     if (token) {
      // config.headers['token'] = token  // 报错: headers对象并没有声明有token, 不能随便添加
      (config.headers)['token'] = token
    }
  return config;
});

/**
 * 响应拦截器
 * 处理响应数据，关闭进度条，并根据状态码显示相应错误消息
 * @param {Object} response - axios响应对象
 * @returns {Object|Promise} 成功时返回响应数据，失败时返回拒绝的Promise
 */
service.interceptors.response.use(
  (response) => {
  NProgress.done()//关闭进度条

    if(response.data.code !== 200){
    // 判断响应状态码
    if (response.data.code == 501)  return  Promise.reject(ElMessage.error("用户名有误"))
    else if (response.data.code == 503) return  Promise.reject(ElMessage.error("密码有误"))
    else if (response.data.code == 504) return  Promise.reject(ElMessage.error("登录已过期"))
    else if (response.data.code == 505) return  Promise.reject(ElMessage.error("用户名占用"))
    } else {
      return response.data.data; /* 返回成功响应数据中的data属性数据 */
    }
  },
  (error) => {
  NProgress.done()//关闭进度条
    return Promise.reject(error.message);
  }
);

export default service;

const TokenKey = 'vue_admin_template_token';

/**
 * 获取存储在localStorage中的token
 * @returns 返回token字符串，如果不存在则返回null
 */
export function getToken() {
  return localStorage.getItem(TokenKey);
}

/**
 * 将token存储到localStorage中
 * @param {string} token - 要存储的token字符串
 */
export function setToken(token) {
  localStorage.setItem(TokenKey, token);
}

/**
 * 从localStorage中移除token
 */
export function removeToken() {
  localStorage.removeItem(TokenKey);
}